package ar.republicagroup.gestion.dao.jpa;

import ar.republicagroup.gestion.dao.DepositoDAO;
import ar.republicagroup.gestion.entities.Cliente;
import ar.republicagroup.gestion.entities.Deposito;
import ar.republicagroup.gestion.services.DepositoServices;
import ar.republicagroup.gestion.util.JPAUtil;
import ar.republicagroup.gestion.util.UserSession;
import ar.republicagroup.gestion.util.messages.UIMessages;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.swing.DefaultComboBoxModel;
import org.apache.log4j.Logger;

/**
 *
 * @author DIEGOALV
 */
public class DepositoDAOImpl implements DepositoDAO {
    
    private static Logger log = Logger.getLogger(ChequeDAOImplJPA.class);
    private EntityManager	em;
    
    
    
    public DepositoDAOImpl(){
           em = JPAUtil.getEntityManager();
    }
    

    @Override
    public List<Deposito> findEntities() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String insert(Deposito beanDeposito) {
        
        if(!em.isOpen()) { em = JPAUtil.getEntityManager(); }
        
                        String resultado = null;
		
        try{
			em.getTransaction().begin();
			em.persist(beanDeposito);
			em.getTransaction().commit();
			resultado = UIMessages.getInfoMessage("onCompleteInsert");
                        log.info(UserSession.getInstance().getUser_name()+"--->"+"Insertando depósito...");
            }           catch(Exception ex){
                        log.error("Error insertando cheque...",ex);
			em.getTransaction().rollback();
                        
            }
		
            finally {
                        em.close();
                        return resultado;
                     }
    }

    @Override
    public String update(Deposito beanDeposito) {
        
        if(!em.isOpen()) { em = JPAUtil.getEntityManager(); }    
        
        String mensaje = null;
        
            Deposito deposito = em.find(Deposito.class,beanDeposito.getId());
            deposito.setId(beanDeposito.getId());
            deposito.setFechaDeposito(beanDeposito.getFechaDeposito());
            deposito.setEfectivoDepositado(beanDeposito.getEfectivoDepositado());
            deposito.setClienteId(beanDeposito.getClienteId());
            deposito.setFechaLiquidacion(beanDeposito.getFechaLiquidacion());
            deposito.setComision(beanDeposito.getComision());
            deposito.setCuentaBancoId(beanDeposito.getCuentaBancoId());
        
         try   {
                    em.getTransaction().begin();
                    em.merge(deposito);	
                    em.getTransaction().commit();
                    mensaje = UIMessages.getInfoMessage("onCompleteUpdate");
                    log.info("Actualización de depósito correcto!");
		}catch(Exception ex){
                    em.getTransaction().rollback();
                    log.error("Error al actualizar depósito -->"+ex.getMessage(),ex);
		}
        
         return mensaje;
    }

    @Override
    public Deposito get(Integer idDeposito) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String delete(Integer idDeposito) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public DefaultComboBoxModel combo() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public List<Deposito> getDepositosByFilters(Cliente cliente, Date fechaDesde, Date fechaHasta, int radioButtonOption) {
       
            if(!em.isOpen()) { em = JPAUtil.getEntityManager(); }
        
            CriteriaBuilder qb              = em.getCriteriaBuilder();
            CriteriaQuery cq                = qb.createQuery();
            Root<Deposito> deposito         = cq.from(Deposito.class);
            List<Predicate> predicates      = new ArrayList<>();
            
            if(fechaDesde != null && fechaHasta != null){
                Date fechaInicio = fechaDesde;
                fechaInicio.setHours(0);
                fechaInicio.setMinutes(0);
                fechaInicio.setSeconds(0);
                
                Date fechaFin    = fechaHasta;
                fechaFin.setHours(23);
                fechaFin.setMinutes(59);
                fechaFin.setSeconds(59);
                predicates.add(qb.between(deposito.get("fechaDeposito").as(Date.class), fechaInicio, fechaFin));
            }
            
            if(cliente != null){
                predicates.add(qb.equal(deposito.get("clienteId"),cliente));
            }
            
            if(radioButtonOption == DepositoServices.OPTION_LIQUIDADOS){
                predicates.add(deposito.get("fechaLiquidacion").isNotNull());
            }
            
            if(radioButtonOption == DepositoServices.OPTION_PENDIENTES){
                predicates.add(deposito.get("fechaLiquidacion").isNull());
            }
            
                    
            cq.select(deposito).where(predicates.toArray(new Predicate[]{}));
            cq.orderBy(qb.desc(deposito.get("id").as(Integer.class)));
            List<Deposito> resultList = em.createQuery(cq).getResultList();
            
            return resultList;
    }

    
   
    
    
    
}
